home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / programming / arexx / parsevariables / parsevariables.rexx < prev   
OS/2 REXX Batch file  |  1999-09-06  |  3KB  |  103 lines

  1. /*
  2. $VER: ParseVariables() v1.0 (14 Aug 1999) © Ron Goertz (goertz@earthlink.net)
  3.  
  4. The ParseVariables() routine takes an error line (usually an
  5. equation) as its argument and determines the values of any
  6. variables in that line. This can greatly speed up debugging by
  7. not having to enter specific debugging information lines for each
  8. suspect line.
  9.  
  10. * Functions (eg, left(), strip(), etc) are not included in the printout
  11. * All uninitialized variables will be put in a single line labeled LIT
  12. * All variables, including those used in compound variables, will have
  13.     their current value printed
  14. * Variables will only be listed once
  15.  
  16. Because the routine must be able to query the values of the variables in
  17. the suspect line, this routine can't be made a PROCEDURE. All variables
  18. used by the routine, then, start with PV_ to (hopefully) prevent over-writing
  19. variables used by the main program.
  20.  
  21. To see the results of this macro, simply open a shell and type
  22.  
  23.   rx <path>ParseVariables.rexx
  24.  
  25. Try changing the assigned variables and the "dummy" line to see other results.
  26.  
  27. Please let me (Ron Goertz <goertz@earthlink.net>) know if this function is of
  28. use to you, doesn't work for you, or if you have ideas on how to improve it.
  29. This routine was developed for use in my calendar creator, FWCalendar: THE
  30. calendar creator for Final Writer and PageStream.
  31. */
  32.  
  33. options results
  34. signal on syntax
  35.  
  36. a     = 'Hello'
  37. b     = 6
  38. c     = 3
  39. d     = 2
  40. Stem. = 'Variable'
  41.  
  42. dummy = strip(left(substr(Stem.c.d, b, b/3), b*z))
  43. exit
  44.  
  45. /*******  Syntax () Subroutine  ***********/
  46. Syntax:
  47.   signal off syntax
  48.  
  49.   call writeln(stdout, 'Error 'RC' ('errortext(RC)')')
  50.   call writeln(stdout, 'Line 'SIGL': 'strip(SourceLine(SIGL)))
  51.   call writeln(stdout, ParseVariables(SourceLine(SIGL)))
  52.   exit
  53. /**/
  54.  
  55. /*******  ParseVariables (PV) Subroutine  ***********/
  56. ParseVariables:
  57. parse arg PV_Line
  58.  
  59. PV_String = translate(PV_Line,,'=(+-*/,)"'||"'",' ')
  60. PV_VarString = ''
  61. PV_Var.      = '00'x
  62. PV_LongVar   = 0
  63. PV_LIT       = ''
  64. PV_Count     = 0
  65.  
  66. do PV_i = 1 to words(PV_String)
  67.   PV_Word = word(PV_String, PV_i)
  68.   if pos(PV_Word'(', PV_Line) > 0 then iterate
  69.   if datatype(PV_Word) == 'CHAR' then do
  70.     if symbol(PV_Word) == 'LIT' then PV_LIT = PV_LIT''PV_Word', '
  71.     if symbol(PV_Word) == 'VAR' then do
  72.       PV_LongVar = max(PV_LongVar, length(PV_Word) + 2)
  73.       if PV_Var.PV_Word == '00'x then do
  74.         PV_Count = PV_Count + 1
  75.         PV_Var.PV_Count = PV_Word
  76.         PV_Var.PV_Word  = value(PV_Word)
  77.       end
  78.       if pos('.', PV_Word) > 0 then do
  79.         PV_CompoundParts = subword(translate(PV_Word,,'.', ' '), 2)
  80.         do PV_j = 1 to words(PV_CompoundParts)
  81.           PV_Subword = word(PV_CompoundParts, PV_j)
  82.           if PV_Var.PV_SubWord == '00'x then do
  83.             PV_Count = PV_Count + 1
  84.             PV_Var.PV_Count = PV_SubWord
  85.             if symbol(PV_Subword) == 'LIT' then PV_Var.PV_SubWord  = 'LIT'
  86.             else PV_Var.PV_SubWord  = value(PV_SubWord)
  87.           end
  88.         end
  89.       end
  90.     end
  91.   end
  92. end
  93.  
  94. do PV_i = 1 to PV_Count
  95.   PV_Word = PV_Var.PV_i
  96.   PV_VarString = PV_VarString''right(PV_Word, PV_LongVar)' = 'PV_Var.PV_Word||'0a'x
  97. end
  98.  
  99. if PV_LIT ~= '' then PV_VarString = right('LIT', PV_LongVar)' = 'strip(PV_LIT, 'B', ' ,')||'0a'x||PV_VarString
  100. return PV_VarString
  101. /**/
  102.  
  103.